// // 1.系统中有多个生产者进程和多个消费者进程,共享一个能存放1000件产品的环形缓冲区(初始为
// //
// // 空)。当缓冲区未满时,生产者进程可以放入其生产的一件产品,否则等待;当缓冲区未空时,消费
// //
// // 者进程可以从缓冲区取走一件产品,否则等待。要求一个消费者进程从缓冲区连续取出10件产品后,
// //
// // 其他消费者进程才可以取产品。请使用信号量P/V(wait()/signal())操作实现进程间的互斥与同步,要
// //
// // 求写出完整的过程,并说明所用信号量的含义和初值。
// #include <stdio.h>
// #include <stdlib.h>
// #include <pthread.h>
// #include <semaphore.h>
// #include <unistd.h>
//
// #define BUFFER_SIZE 1000
//
// // 信号量定义
// sem_t empty; // 缓冲区空闲位置数量
// sem_t full;  // 缓冲区已存放产品数量
// sem_t mutex_Buffer; // 缓冲区互斥访问
// sem_t mutex_Consumer; // 消费者互斥访问
//
// int buffer[BUFFER_SIZE]; // 缓冲区
// int in = 0; // 缓冲区的生产者指针
// int out = 0; // 缓冲区的消费者指针
//
// // 生产一件产品
// void produce_item() {
//     int item = rand() % 100; // 生成一个随机产品
//     printf("Produced item: %d\n", item);
//     return item;
// }
//
// // 把产品放入缓冲区
// void put_item_into_buffer(int item) {
//     buffer[in] = item;
//     in = (in + 1) % BUFFER_SIZE;
// }
//
// // 从缓冲区取走一件产品
// int take_item_from_buffer() {
//     int item = buffer[out];
//     out = (out + 1) % BUFFER_SIZE;
//     return item;
// }
//
// // 消费这件产品
// void consume_item(int item) {
//     printf("Consumed item: %d\n", item);
// }
//
// // 生产者线程函数
// void* producer(void* arg) {
//     while (1) {
//         int item = produce_item(); // 生产一件产品
//
//         sem_wait(&empty); // 占用一个缓冲区,如剩余容量不足则等待
//         sem_wait(&mutex_Buffer); // (互斥)防止他人访问缓冲区
//         put_item_into_buffer(item); // 把产品放入缓冲区
//         sem_post(&mutex_Buffer); // (互斥)允许他人访问缓冲区
//         sem_post(&full); // (同步)缓冲区的已用容量加1
//
//         sleep(1); // 模拟生产时间
//     }
//     return NULL;
// }
//
// // 消费者线程函数
// void* consumer(void* arg) {
//     while (1) {
//         sem_wait(&mutex_Consumer); // (互斥)防止其他消费者进程进入缓冲区
//
//         for (int i = 0; i < 10; ++i) {
//             sem_wait(&full); // 申请使用缓冲区的产品,如没有产品则等待生产者生产
//             sem_wait(&mutex_Buffer); // (互斥)防止他人访问缓冲区
//             int item = take_item_from_buffer(); // 从缓冲区取走一件产品
//             sem_post(&mutex_Buffer); // (互斥)允许他人访问缓冲区
//             sem_post(&empty); // 释放一个缓冲区
//             consume_item(item); // 消费这件产品
//
//             sleep(1); // 模拟消费时间
//         }
//
//         sem_post(&mutex_Consumer); // (互斥)允许其他消费者进程进入缓冲区
//     }
//     return NULL;
// }
//
// int main() {
//     // 初始化信号量
//     sem_init(&empty, 0, BUFFER_SIZE);
//     sem_init(&full, 0, 0);
//     sem_init(&mutex_Buffer, 0, 1);
//     sem_init(&mutex_Consumer, 0, 1);
//
//     // 创建生产者和消费者线程
//     pthread_t producer_thread, consumer_thread;
//     pthread_create(&producer_thread, NULL, producer, NULL);
//     pthread_create(&consumer_thread, NULL, consumer, NULL);
//
//     // 等待线程结束
//     pthread_join(producer_thread, NULL);
//     pthread_join(consumer_thread, NULL);
//
//     // 销毁信号量
//     sem_destroy(&empty);
//     sem_destroy(&full);
//     sem_destroy(&mutex_Buffer);
//     sem_destroy(&mutex_Consumer);
//
//     return 0;
// }
// // 解析:本题属于生产者-消费者问题;
// //
// // (1)定义互斥信号量mutex_Consumer,用于实现一个消费者进程进入缓冲区,且尚未取出10件产品
// //
// // 时,其他消费者进程不可以进入缓冲区取产品;
// //
// // (2)定义互斥信号量mmex_Buffer,用于实现对缓冲区的互斥访问;
// //
// // (3)定义信号量empty和full,分别表示缓冲区的空位数和已用数,具体如下:
// //
// // Semaphore mutex_Consumer=1;//实现消费者进程之间的互斥操作
// //
// // Semaphore mutex_Buffer=1;//实现对缓冲区的互斥访问
// //
// // Semaphore empty=n;//缓冲区的空位数
// //
// // Semaphore full=0;//缓冲区的已用数
